<?php

namespace App\Services;

use Illuminate\Support\Str;
use Illuminate\Support\Facades\Crypt;

class SecureTokenService
{
    /**
     * 创建OpenID安全令牌
     * 
     * @param string $openid 微信OpenID
     * @return string 加密后的安全令牌
     */
    public function createOpenidToken($openid, $nickname = null, $headimgurl = null)
    {
        // 创建有效载荷（包含openid和过期时间）
        $payload = [
            'openid' => $openid,
            'nickname' => $nickname,
            'avatar' => $headimgurl,
            'exp' => now()->addMinutes(10)->timestamp, // 10分钟有效期
            'uuid' => Str::uuid() // 唯一标识符防止重放攻击
        ];
        
        return Crypt::encryptString(json_encode($payload));
    }

    /**
     * 解析安全令牌
     * 
     * @param string $token 加密的安全令牌
     * @return array|null 解析后的payload或null
     */
    public function parseOpenidToken($token)
    {
        try {
            // 解密令牌
            $decrypted = Crypt::decryptString($token);
            $payload = json_decode($decrypted, true);
            
            // 验证令牌格式和有效期
            if (!$this->isValidPayload($payload)) {
                return null;
            }
            
            return $payload;
        } catch (\Exception $e) {
            // 记录错误日志
            \Log::error('令牌解析失败: '.$e->getMessage());
            return null;
        }
    }

    /**
     * 验证payload有效性
     */
    protected function isValidPayload($payload)
    {
        // 检查必需字段是否存在
        if (!isset($payload['openid'], $payload['exp'], $payload['uuid'])) {
            return false;
        }
        
        // 验证令牌是否过期
        if ($payload['exp'] < time()) {
            return false;
        }
        
        // 验证UUID格式
        if (!preg_match('/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i', $payload['uuid'])) {
            return false;
        }
        
        return true;
    }
}